~`_%"$'\%,LTCvfpcleanN%CO8B CULOAPP STARTCLEAN%C B C C C C C C C C ]U THIS CHECKSTARTUP CLEANFOXREG CLEANSAMPLES CLEANFOXCODE CLEANFOXTASK CLEANFOXXTRAS CLEANCHMS CLEANAPPKEYA T#TC_STARTUP!TCVFPCLEAN% &WTCzThe VFPClean utility will check and repair invalid Visual FoxPro options registry keys and certain critical product files.C C C C {If you are running VFPClean just after installing Visual FoxPro, select . This silent option is typically used if you Yhad a previous Beta version on your machine and want to restore to a clean install state.C C C C Select if you want to run VFPClean in normal interactive mode to detect invalid registry keys and critical product files. 7See the Visual FoxPro readme.htm file for more details.#x H" Ta T-2"B-T U LCOPTIONVALUELNMBLNERRTHISOFOXREG GETFOXOPTIONLSTARTUP LDISPLAYLOG,C _BEAUTIFYCQ BEAUTIFY.APP*C_BROWSERCQ BROWSER.APP*C_BUILDERCQ BUILDER.APP,C _CODESENSECQ FOXCODE.APP,C _CONVERTERCQ CONVERT.APP,C _COVERAGECQ COVERAGE.APP*C_GALLERYCQ GALLERY.APP*C_GENHTMLCQ GENHTML.PRG*C_GENMENUCQ GENMENU.PRG*C_GENXTABCQ VFPXTAB.PRG6C_OBJECTBROWSERCQOBJECTBROWSER.APP*C_SCCTEXTCQ SCCTEXT.PRG,C _TASKLISTCQ TASKLIST.APP(C_WIZARDCQ WIZARD.APP*C_TOOLBOXCQ TOOLBOX.APP(C_FOXREFCQ FOXREF.APP+CHelpToCQDV_FOXHELP.CHMUTHIS CHECKFOXREG T#TC_SAMPLES%C UB%C="TC$%CCfCCQSamples\fB%T"CCQSamples\f"C_SAMPLESC_SAMPLESU LCOPTIONVALUELNERRTHISOFOXREG GETFOXOPTION UPDATELOG SETFOXOPTIONP  T T T%CCC cBTC%C B%C="TC %C 0 CfCf B%C 0 C0 B%C 0 %  CٴIt appears that critical files (e.g., Wizards) are missing from your Visual FoxPro installation. It is recommended that you rereun the Visual FoxPro setup to reinstall these files.xT aB%  H5 C0 E CCfCCf% %CYou have references to critical files (e.g., Wizards) which appear to be those of an older version of Visual FoxPro. Would you like to change your references to use files from the current version (Yes) or keep using the older ones (No)?$xT aT a% B2%  %CYou have references to critical files (e.g., Wizards) which are not the default ones (you may have overridden the default setting with your own custom version). Would you like to keep your current settings (Yes) or reset to the default ones (No)?$xTaT a%BC!C""UTCREGKEY TCDEFAULTFILE LCOPTIONVALUE LCOPTIONNAME LCDEFAULTFILELNERRTHISOFOXREG GETFOXOPTION LSHOWMSGBOXLSTARTUPLSKIPOLDFILESMSGBOX LSKIPOLDFILESLSKIPNONDEFFILESMSGBOXLSKIPNONDEFFILES UPDATELOG SETFOXOPTION TTCCC +aT T_C_.DBF%C0 ! BU TCFILENAME LNFILECOUNT LCBACKFILE LCFILENAMEP TN%CCN0 IC_FOXTASKU LCFILENAMETHISOFOXREG SETFOXOPTIONG TM%CCM0 C_FOXCODEtCdYour foxcode table (_FOXCODE) could not be found. Please run the IntelliSense Manager to restore it. BTCQC%C0 CfCf B% CٌWould you like to replace your foxcode table (_FOXCODE) with a clean copy from your home directory (a backup of your original will be made)?$x BTC %CQTQ%CL/TLTC TC Q%CC 1 (Q CFPT Q%CC  (QaCQThe foxcode table (_FOXCODE) was backed up and replaced in the original location. TC U LCFILENAME LCBACKUPFILE LCEDITOPTIONS LCHOMEFILELTFILE1LTFILE2THISOFOXREG SETFOXOPTION UPDATELOGLSTARTUP EDITOROPTIONS GETBACKUPFILETCQ foxrefs.dbf%C0  Q%CC 2%CC/fCACTIVEXCC/fCFNAME Q CFPTQTCCM foxws.dbf%C0TCQ foxcode.dbf%C0 Q%CCAB#)TCgQ Q%CC #)%CgTC (Q CFPTCAn outdated web services table (FOXWS.DBF) was found, backed up and deleted in the original location. This table will automatically be recreated the next time you use one of the Web Services components. QU LCFILENAME LNFOXCODEVER LCBACKUPFILE LCHOMEFILETHISLSTARTUPEXPANDEDNAME GETBACKUPFILE UPDATELOG{  T1%C.chm %Cchm.file1Cchm.file.chm a T5%Cchm.file t%C HTML Helpp"TCCwindir5hh.exe!%CCwindir5 C0 lXCHThe HTML Help (.CHM) file extension was found to be broken and restored.DCCompiled HTML Help filechm.file a?C,0chm.file\DefaultIcon aMC"" %1chm.file\shell\open\command aULCHHEXELCVALUETHISOFOXREG GETREGKEY SETREGKEY UPDATELOG:T applications\CC\shell\open\command T.%C B%CB"TCCCCC=%C="TC\%C0BFC"C" -SHELLOPEN "%1" a^CNThe HKCR Applications registry key for Visual FoxPro was invalid and restored.U LCFILELCVALUELCKEY SERVERNAMETHISOFOXREG GETREGKEY SETREGKEY UPDATELOGU%C 3CTCUTCDESCTHISALOGS%CtZCNThis utility can only be run in the full development version of Visual FoxPro.xB-+TCfoxreg..\FFC\registry%COB-TU STARTMODETHISOFOXREGALOGS %lQCEChanges were made that require you to quit and restart Visual FoxPro.x%C_STARTUP%TىVFPClean detected and repaired the following issues (note -- the IntelliSense Manager will automatically check for valid Foxcode tables):C C %C,TC C No issues found%C=_iTC C @The following Visual FoxPro options registry keys were updated: C C (C!%CC =_'TC C C 3TC C C C C  CxU LCLOGSTRITHISLREQUIRESRESTARTLSTARTUPOFOXREG SETFOXOPTION LDISPLAYLOGALOGSWTa %-P(VFPClean Error: UNERRORCMETHODNLINETHIS LHADERROR StartClean CheckStartup CleanFoxReg CleanSamples CheckFoxRegl  GetBackupFile CleanFoxTask~ CleanFoxCode CleanFoxXtras CleanCHMs CleanAppKey UpdateLogInitLDestroyPError! T T- T- T- T- T- T- T- T- T -            U OFOXREG LHADERRORLSTARTUP LSHOWMSGBOX LSKIPOLDFILESLSKIPOLDFILESMSGBOXLSKIPNONDEFFILESLSKIPNONDEFFILESMSGBOXLREQUIRESRESTART LDISPLAYLOGALOGSvfpcleanSession>#qQAA1!AA31q%qAAA3a3q1AAqAAAAQ3AAAAqAAAAA# AAAAAAAAAAAAAA3qAAA3qA3AAACAA AAq!Aq!ASAQAAA32!AQAAAAAAQAQ1QAQ AAAAA3AAQ!AAAA3AAAA!q!AAAb3q1A31qAqAa3AA! !Aq1AAAA3A3 0`7 z b6YD&}W8'kH|do %%o**b.>..1X;11n12v352568t #6(0 mPLATFORMCUNIQUEIDC TIMESTAMPN CLASSMCLASSLOCM!BASECLASSM%OBJNAMEM)PARENTM-PROPERTIESM1PROTECTEDM5METHODSM9OBJCODEM=OLEMAOLE2MERESERVED1MIRESERVED2MMRESERVED3MQRESERVED4MURESERVED5MYRESERVED6M]RESERVED7MaRESERVED8MeUSERMi COMMENT Class  WINDOWS _RJL0UV82J 621908248axjX COMMENT RESERVED f< WINDOWS _RJL0V1NVV 693857578n{`N COMMENT RESERVED x WINDOWS _RJL0UXJVX 693857586dV-<v"7 COMMENT RESERVED - WINDOWS _RJL0UQOZ1 693857602-]< COMMENT RESERVED tA WINDOWS _RJL0U66ZY 754413991z3dEdqe@VD COMMENT RESERVED 4VERSION = 3.00 registry.hf Ё+registry registry.hPixelsClass1customregistrynuserkey = 0 cvfpoptpath = cregdllfile = cinidllfile = codbcdllfile = ncurrentos = 0 ncurrentkey = 0 capppathkey = Name = "registry" custom registry.hf Ё+1foxreg oldinireg registry.hPixelsClassregistry oldiniregName = "oldinireg" custom registry.vcx registry.hf Ё+odbcreg registry.hf Ё+ registry.hPixelsClass1registryfoxregName = "foxreg" custom registry.vcx registry.hPixelsClass1registryodbcregName = "odbcreg" custom registry.vcx registry.hf Ё+filereg*setfoxoption Sets an option from FoxPro registry settings. *getfoxoption Retrieves an option from FoxPro registry settings. *enumfoxoptions *getinisection Retrieves information from INI section. *getinientry Retrieves information from INI entry. *writeinientry Writes a specific INI entry. *loadinifuncs Loads functions needed for reading INI files. h OO %DNUD T%C m.cINIFilebCZ T&%C  BTCC   T( 4T CC  )T C   \T  BU ASECTIONSCSECTIONCINIFILE CINIVALUE NTOTENTRIESINLASTPOSTHIS GETINIENTRYNTMPPOSZ TCtTC % b B %  T T CX%C *T C  C > 0T C  C >  % 2 BT C  = BU CVALUECSECTIONCENTRYCINIFILECBUFFERNBUFSIZENERRNUM NTOTPARMSTHIS LOADINIFUNCS GETWININI GETPRIVATEINITC% I B %C ~ TC   &TC   BC  6U CVALUECSECTIONCENTRYCINIFILENERRNUMTHIS LOADINIFUNCS WRITEWININIWRITEPRIVATEINIW% BG|GetPrivateProfileStringWin32APIQ GetPrivateINI%~ B:|GetProfileStringWin32APIQ GetWinINI:|WriteProfileStringWin32APIQ WriteWinINIG|WritePrivateProfileStringWin32APIQWritePrivateINITa BU THIS LLOADEDINISGETPRIVATEPROFILESTRINGWIN32API GETPRIVATEINI LHADERRORGETPROFILESTRING GETWININIWRITEPROFILESTRING WRITEWININIWRITEPRIVATEPROFILESTRINGWRITEPRIVATEINI getinisection, getinientry writeinientry loadinifuncs11AbAb1A3131A3A"A2A31s1AbA3AsAs27YC*g:?7] W)O*loadodbcfuncs Loads ODBC registry functions. *getodbcdrvrs Retrieves ODBC drivers. *enumodbcdrvrs Enumerates through ODBC drivers. *enumodbcdata Enumerates through ODBC data sources.  registry.hPixelsClass1registryfilereg*getapppath Checks and returns path of application associated with a particular extension (e.g., XLS, DOC). *getlatestversion Returns latest version for a specified application. *getapplication Retrieves application key. Name = "filereg" custom registry.vcxPROCEDURE setfoxoption LPARAMETER cOptName,cOptVal RETURN THIS.SetRegKey(cOptName,cOptVal,THIS.cVFPOptPath,THIS.nUserKey) ENDPROC PROCEDURE getfoxoption LPARAMETER cOptName,cOptVal RETURN THIS.GetRegKey(cOptName,@cOptVal,THIS.cVFPOptPath,THIS.nUserKey) ENDPROC PROCEDURE enumfoxoptions LPARAMETER aFoxOpts RETURN THIS.EnumOptions(@aFoxOpts,THIS.cVFPOptPath,THIS.nUserKey,.F.) ENDPROC B ))I%h U/ !BCUCOPTNAMECOPTVALTHIS SETREGKEY CVFPOPTPATHNUSERKEY/ !BCUCOPTNAMECOPTVALTHIS GETREGKEY CVFPOPTPATHNUSERKEY(BC-UAFOXOPTSTHIS ENUMOPTIONS CVFPOPTPATHNUSERKEY setfoxoption, getfoxoptionenumfoxoptions133q2}+ )) PROCEDURE getapppath * Checks and returns path of application * associated with a particular extension (e.g., XLS, DOC). LPARAMETER cExtension,cExtnKey,cAppKey,lServer LOCAL nErrNum,cOptName cOptName = "" * Check Extension parameter IF TYPE("m.cExtension") # "C" OR LEN(m.cExtension) > 3 RETURN ERROR_BADPARM ENDIF m.cExtension = "."+m.cExtension * Open extension key nErrNum = THIS.OpenKey(m.cExtension) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Get key value for file extension nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey) * Close extension key THIS.CloseKey() IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer) ENDPROC PROCEDURE getlatestversion LPARAMETER cClass,cExtnKey,cAppKey,lServer LOCAL nErrNum,cOptName cOptName = "" * Open class key (e.g., Excel.Sheet) nErrNum = THIS.OpenKey(m.cClass+CURVER_KEY) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Get key value for file extension nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey) * Close extension key THIS.CloseKey() IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer) ENDPROC PROCEDURE getapplication LPARAMETERS cExtnKey,cAppKey,lServer LOCAL nErrNum,cOptName cOptName = "" * lServer - checking for OLE server. IF TYPE("m.lServer") = "L" AND m.lServer THIS.cAppPathKey = OLE_PATH_KEY ELSE THIS.cAppPathKey = APP_PATH_KEY ENDIF * Open extension app key m.nErrNum = THIS.OpenKey(m.cExtnKey+THIS.cAppPathKey) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Get application path nErrNum = THIS.GetKeyValue(cOptName,@cAppKey) * Close application path key THIS.CloseKey() RETURN m.nErrNum ENDPROC  l%-1U  T/%C m.cExtensionbC C > d BT . TC %  B TC C %  B BC U CEXTENSIONCEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHISOPENKEY GETKEYVALUECLOSEKEYGETAPPLICATION  T!TC \CurVer% j B TC C %  B BC U CCLASSCEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHISOPENKEY GETKEYVALUECLOSEKEYGETAPPLICATION   T&%C m.lServerbL  |/T\Protocol\StdFileEditing\Server#T\Shell\Open\CommandT C %  B TC C B U CEXTNKEYCAPPKEYLSERVERNERRNUMCOPTNAMETHIS CAPPPATHKEYOPENKEY GETKEYVALUECLOSEKEY getapppath,getlatestversiongetapplication13Aas1A2A311A2A3c1A1A2 !8) IPROCEDURE loadodbcfuncs IF THIS.lLoadedODBCs RETURN ERROR_SUCCESS ENDIF * Check API file containing functions IF EMPTY(THIS.cODBCDLLFile) RETURN ERROR_NOODBCFILE ENDIF LOCAL henv,fDirection,szDriverDesc,cbDriverDescMax LOCAL pcbDriverDesc,szDriverAttributes,cbDrvrAttrMax,pcbDrvrAttr LOCAL szDSN,cbDSNMax,pcbDSN,szDescription,cbDescriptionMax,pcbDescription DECLARE Short SQLDrivers IN (THIS.cODBCDLLFile) ; Integer henv, Integer fDirection, ; String @ szDriverDesc, Integer cbDriverDescMax, Integer pcbDriverDesc, ; String @ szDriverAttributes, Integer cbDrvrAttrMax, Integer pcbDrvrAttr IF THIS.lhaderror && error loading library RETURN -1 ENDIF DECLARE Short SQLDataSources IN (THIS.cODBCDLLFile) ; Integer henv, Integer fDirection, ; String @ szDSN, Integer cbDSNMax, Integer @ pcbDSN, ; String @ szDescription, Integer cbDescriptionMax,Integer pcbDescription THIS.lLoadedODBCs = .T. RETURN ERROR_SUCCESS ENDPROC PROCEDURE getodbcdrvrs LPARAMETERS aDrvrs,lDataSources LOCAL nODBCEnv,nRetVal,dsn,dsndesc,mdsn,mdesc lDataSources = IIF(TYPE("m.lDataSources")="L",m.lDataSources,.F.) * Load API functions nRetVal = THIS.LoadODBCFuncs() IF m.nRetVal # ERROR_SUCCESS RETURN m.nRetVal ENDIF * Get ODBC environment handle nODBCEnv=VAL(SYS(3053)) * -- Possible error messages * 527 "cannot load odbc library" * 528 "odbc entry point missing" * 182 "not enough memory" IF INLIST(nODBCEnv,527,528,182) * Failed RETURN ERROR_ODBCFAIL ENDIF DIMENSION aDrvrs[1,IIF(m.lDataSources,2,1)] aDrvrs[1] = "" DO WHILE .T. dsn=space(100) dsndesc=space(100) mdsn=0 mdesc=0 * Return drivers or data sources IF m.lDataSources nRetVal = SQLDataSources(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,255,@mdesc) ELSE nRetVal = SQLDrivers(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,100,@mdesc) ENDIF DO CASE CASE m.nRetVal = SQL_NO_DATA nRetVal = ERROR_SUCCESS EXIT CASE m.nRetVal # ERROR_SUCCESS AND m.nRetVal # 1 EXIT OTHERWISE IF !EMPTY(aDrvrs[1]) IF m.lDataSources DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,2] ELSE DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,1] ENDIF ENDIF dsn = ALLTRIM(m.dsn) aDrvrs[ALEN(aDrvrs,1),1] = LEFT(m.dsn,LEN(m.dsn)-1) IF m.lDataSources dsndesc = ALLTRIM(m.dsndesc) aDrvrs[ALEN(aDrvrs,1),2] = LEFT(m.dsndesc,LEN(m.dsndesc)-1) ENDIF ENDCASE ENDDO RETURN nRetVal ENDPROC PROCEDURE enumodbcdrvrs LPARAMETER aDrvrOpts,cODBCDriver LOCAL cSourceKey cSourceKey = ODBC_DRVRS_KEY+m.cODBCDriver RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_LOCAL_MACHINE,.F.) ENDPROC PROCEDURE enumodbcdata LPARAMETER aDrvrOpts,cDataSource LOCAL cSourceKey cSourceKey = ODBC_DATA_KEY+cDataSource RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_CURRENT_USER,.F.) ENDPROC  PROCEDURE getinisection LPARAMETERS aSections,cSection,cINIFile LOCAL cINIValue, nTotEntries, i, nLastPos cINIValue = "" IF TYPE("m.cINIFile") # "C" cINIFile = "" ENDIF IF THIS.GetINIEntry(@cINIValue,cSection,0,m.cINIFile) # ERROR_SUCCESS RETURN ERROR_FAILINI ENDIF nTotEntries=OCCURS(CHR(0),m.cINIValue) DIMENSION aSections[m.nTotEntries] nLastPos = 1 FOR i = 1 TO m.nTotEntries nTmpPos = AT(CHR(0),m.cINIValue,m.i) aSections[m.i] = SUBSTR(m.cINIValue,m.nLastPos,m.nTmpPos-m.nLastPos) nLastPos = m.nTmpPos+1 ENDFOR RETURN ERROR_SUCCESS ENDPROC PROCEDURE getinientry LPARAMETER cValue,cSection,cEntry,cINIFile * Get entry from INI file LOCAL cBuffer,nBufSize,nErrNum,nTotParms nTotParms = PCOUNT() * Load API functions nErrNum= THIS.LoadINIFuncs() IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Parameter checks here IF m.nTotParms < 3 m.cEntry = 0 ENDIF m.cBuffer=space(2000) IF EMPTY(m.cINIFile) * WIN.INI file m.nBufSize = GetWinINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer)) ELSE * Private INI file m.nBufSize = GetPrivateINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer),m.cINIFile) ENDIF IF m.nBufSize = 0 &&could not find entry in INI file RETURN ERROR_NOINIENTRY ENDIF m.cValue=LEFT(m.cBuffer,m.nBufSize) ** All is well RETURN ERROR_SUCCESS ENDPROC PROCEDURE writeinientry LPARAMETER cValue,cSection,cEntry,cINIFile * Get entry from INI file LOCAL nErrNum * Load API functions nErrNum = THIS.LoadINIFuncs() IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF IF EMPTY(m.cINIFile) * WIN.INI file nErrNum = WriteWinINI(m.cSection,m.cEntry,m.cValue) ELSE * Private INI file nErrNum = WritePrivateINI(m.cSection,m.cEntry,m.cValue,m.cINIFile) ENDIF ** All is well RETURN IIF(m.nErrNum=1,ERROR_SUCCESS,m.nErrNum) ENDPROC PROCEDURE loadinifuncs * Loads funtions needed for reading INI files IF THIS.lLoadedINIs RETURN ERROR_SUCCESS ENDIF DECLARE integer GetPrivateProfileString IN Win32API ; AS GetPrivateINI string,string,string,string,integer,string IF THIS.lhaderror && error loading library RETURN -1 ENDIF DECLARE integer GetProfileString IN Win32API ; AS GetWinINI string,string,string,string,integer DECLARE integer WriteProfileString IN Win32API ; AS WriteWinINI string,string,string DECLARE integer WritePrivateProfileString IN Win32API ; AS WritePrivateINI string,string,string,string THIS.lLoadedINIs = .T. * Need error check here RETURN ERROR_SUCCESS ENDPROC  }}ђ%KnU% B%C9 B     -|W SQLDrivers% B2|WSQLDataSourcesTa BUTHIS LLOADEDODBCS CODBCDLLFILEHENV FDIRECTION SZDRIVERDESCCBDRIVERDESCMAX PCBDRIVERDESCSZDRIVERATTRIBUTES CBDRVRATTRMAX PCBDRVRATTRSZDSNCBDSNMAXPCBDSN SZDESCRIPTIONCBDESCRIPTIONMAXPCBDESCRIPTION SQLDRIVERS LHADERRORSQLDATASOURCES! 0TCCm.lDataSourcesbL -6TC %  B TCC ]g%C B#C 6T +aTCdXTCdX T T% y-TC d -TC dd  H  d T!   !2 %CC x% OCtCTC .TCC C >=%  TC .TCC C >= BU ADRVRS LDATASOURCESNODBCENVNRETVALDSNDSNDESCMDSNMDESCTHIS LOADODBCFUNCSSQLDATASOURCES SQLDRIVERSa .TSoftware\ODBC\ODBCINST.INI\ BC  -U ADRVROPTS CODBCDRIVER CSOURCEKEYTHIS ENUMOPTIONS[ (TSoftware\ODBC\ODBC.INI\BC  -U ADRVROPTS CDATASOURCE CSOURCEKEYTHIS ENUMOPTIONS loadodbcfuncs, getodbcdrvrsH enumodbcdrvrs enumodbcdata~1A$A21A%31A#A21A1AAAAAAAA3q3q2 #A w eF > l)}nuserkey User registry key. cvfpoptpath Registry path to VFP options settings. cregdllfile DLL file for registry functions. cinidllfile DLL file for INI functions. codbcdllfile DLL file for ODBC functions. ncurrentos Current operating system code. ncurrentkey Current registry key. lloadeddlls Whether registry key functions loaded. lloadedinis Whether INI functions loaded. capppathkey Application path registry key. lcreatekey Whether to create key if one does not already exist. lhaderror Whether an error occurred. lloadedodbcs Whether ODBC functions loaded. ldisallowexpanded lhasdllloaded *loadregfuncs Loads funtions needed for Registry. *openkey Opens a registry key. *closekey Closes a registry key. *setregkey Sets a registry key setting. *getregkey Gets a registry key setting. *getkeyvalue Obtains a value from a registry key. *setkeyvalue Sets a key value. *deletekey Deletes a registry key. *enumoptions Enumerates through all entries for a key and populates array. *iskey Checks to see if a key exists. *enumkeys Enumerates through a registry key. *enumkeyvalues Enumerates through values of a registry key *deletekeyvalue Deletes value from registry key. s ZZ%! UU     %x B%| RegOpenKeyWin32API% B'| RegCreateKeyWin32API$| RegDeleteKeyWin32API%|RegDeleteValueWin32API | RegCloseKeyWin32API,| RegSetValueExWin32API1|RegQueryValueExWin32API'| RegEnumKeyWin32API4| RegEnumKeyExWin32API4| RegEnumValueWin32APITa BU"NHKEYCSUBKEYNRESULTHKEYIVALUE LPSZVALUE LPCCHVALUELPDWTYPELPBDATALPCBDATALPCSTRLPSZVALNLEN LPDWRESERVED LPSZVALUENAME DWRESERVEDFDWTYPEISUBKEYLPSZNAMECCHNAMETHIS LLOADEDDLLS REGOPENKEYWIN32API LHADERROR REGCREATEKEY REGDELETEKEYREGDELETEVALUE REGCLOSEKEY REGSETVALUEEXREGQUERYVALUEEX REGENUMKEY REGENUMKEYEX REGENUMVALUE T TCt(%C m.nRegKeybNC  {T  TC%  B T-% C m.lCreateKeybL T %3TC   YTC   T % B T   BU CLOOKUPKEYNREGKEY LCREATEKEYNSUBKEYNERRCODENPCOUNTLSAVECREATEKEYTHIS LOADREGFUNCS REGCREATEKEY REGOPENKEY NCURRENTKEY#CTU REGCLOSEKEYTHIS NCURRENTKEY T T T%T C    %  B TC  C B U COPTNAMECOPTVALCKEYPATHNUSERKEY LCREATEKEYIPOSCOPTKEYCOPTIONNERRNUMTHISOPENKEY SETKEYVALUECLOSEKEY T T TT C  %  B TC C B U COPTNAMECOPTVALCKEYPATHNUSERKEYIPOSCOPTIONNERRNUMTHISOPENKEY GETKEYVALUECLOSEKEYs J(JCX(JC >(  Hc2 CTHIS.nCurrentKeybN   B C m.cValueNamebC B.T C  %  B  %   G BT C  = BU CVALUENAME CKEYVALUE LPDWRESERVEDLPDWTYPELPBDATALPCBDATANERRCODETHIS NCURRENTKEYREGQUERYVALUEEX%   H#2 CTHIS.nCurrentKeybN  _ B6 C m.cValueNamebCCm.cValuebC  BT C TC >.T C   %  B  BU CVALUENAMECVALUE NVALUESIZENERRCODETHIS NCURRENTKEY REGSETVALUEEXI  TT C  B UNUSERKEYCKEYPATHNERRNUM REGDELETEKEY# T T T*%Ct C m.lEnumKeysbL ~ T-T C  %  B % TC TC  C B U AREGOPTSCOPTPATHNUSERKEY LENUMKEYSIPOSCOPTIONNERRNUMTHISOPENKEYENUMKEYS ENUMKEYVALUESCLOSEKEYe TC % O CB UCKEYNAMENREGKEYNERRNUMTHISOPENKEYCLOSEKEY T  +a TTCdXTC >TCdXTC >TCdX3T C  H ! !TC TC C >=%CC pCTC T !%   T  B U AKEYNAMES NKEYENTRYCNEWKEYCBUFNBUFLENCRETTIMENKEYSIZENERRCODE REGENUMKEYEXTHIS NCURRENTKEY(  J(2%CTHIS.nCurrentKeybN  y B%  B +aJ(JCX(JC>( JC>( 4TC   H7f O! f!T  $T C  = H (T C  =  @(T C  = t#T *Binary* (T C  =2)T *Unknown type*!%   T  B U AKEYVALUES LPSZVALUE LPCCHVALUE LPDWRESERVEDLPDWTYPELPBDATALPCBDATANERRCODE NKEYENTRYTHIS NCURRENTKEY NCURRENTOS REGENUMVALUELDISALLOWEXPANDED  T TT C  % q B T C  C B U COPTNAMECKEYPATHNUSERKEYCOPTIONNERRNUMTHISOPENKEYREGDELETEVALUE NCURRENTKEYCLOSEKEY  T BT Software\Microsoft\VisualFoxPro\C\Options Hz/ 24 3 B-! C Windows 3CJT" C Windows NTCJNTT ADVAPI32.DLLT KERNEL32.DLLT  ODBC32.DLL CCJgTT ADVAPI32.DLLT KERNEL32.DLLT  ODBC32.DLL2/TT ADVAPI32.DLLT KERNEL32.DLLT  ODBC32.DLLTC%1%C RegOpenKeyT aU LATMPDLLSLNDLLSTHISNUSERKEY CVFPOPTPATHVERSION NCURRENTOS CREGDLLFILE CINIDLLFILE CODBCDLLFILE LHASDLLLOADED+Ta CCExUNERRORCMETHODNLINETHIS LHADERROR% V REGOPENKEYV REGCREATEKEYV REGDELETEKEYVREGDELETEVALUEV REGCLOSEKEYV REGSETVALUEEXVREGQUERYVALUEEXV REGENUMKEYV REGENUMKEYEXV REGENUMVALUEUTHIS LHASDLLLOADED loadregfuncs,openkeyclosekey3 setregkeyz getregkey getkeyvalue setkeyvalue deletekeyK enumoptions iskey]enumkeys enumkeyvaluesQdeletekeyvalue Init6ErrorVDestroy11ASAsCSsDE32qA1A!AA"A"33u1S1A351A3r1!A3AA3!aCS3A3q32A1ARRA3q1A3q2AA1AAAAA1AA3r"ACARACAA1AA2SA2AAA31A31!q!QA#AA331QQqAa1QQA1 :4/ ~ c7 iD 5QWfva| '/N#:#p%y%n))))+)Z+'PROCEDURE loadregfuncs * Loads funtions needed for Registry LOCAL nHKey,cSubKey,nResult LOCAL hKey,iValue,lpszValue,lpcchValue,lpdwType,lpbData,lpcbData LOCAL lpcStr,lpszVal,nLen,lpdwReserved LOCAL lpszValueName,dwReserved,fdwType LOCAL iSubKey,lpszName,cchName IF THIS.lLoadedDLLs RETURN ERROR_SUCCESS ENDIF DECLARE Integer RegOpenKey IN Win32API ; Integer nHKey, String @cSubKey, Integer @nResult IF THIS.lhaderror && error loading library RETURN -1 ENDIF DECLARE Integer RegCreateKey IN Win32API ; Integer nHKey, String @cSubKey, Integer @nResult DECLARE Integer RegDeleteKey IN Win32API ; Integer nHKey, String @cSubKey DECLARE Integer RegDeleteValue IN Win32API ; Integer nHKey, String cSubKey DECLARE Integer RegCloseKey IN Win32API ; Integer nHKey DECLARE Integer RegSetValueEx IN Win32API ; Integer hKey, String lpszValueName, Integer dwReserved,; Integer fdwType, String lpbData, Integer cbData DECLARE Integer RegQueryValueEx IN Win32API ; Integer nHKey, String lpszValueName, Integer dwReserved,; Integer @lpdwType, String @lpbData, Integer @lpcbData DECLARE Integer RegEnumKey IN Win32API ; Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName DECLARE Integer RegEnumKeyEx IN Win32API ; Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName,; Integer dwReserved,String @lpszName, Integer @cchName,String @cchName DECLARE Integer RegEnumValue IN Win32API ; Integer hKey, Integer iValue, String @lpszValue, ; Integer @lpcchValue, Integer lpdwReserved, Integer @lpdwType, ; String @lpbData, Integer @lpcbData THIS.lLoadedDLLs = .T. * Need error check here RETURN ERROR_SUCCESS ENDPROC PROCEDURE openkey * Opens a registry key LPARAMETER cLookUpKey,nRegKey,lCreateKey LOCAL nSubKey,nErrCode,nPCount,lSaveCreateKey nSubKey = 0 nPCount = PCOUNT() IF TYPE("m.nRegKey") # "N" OR EMPTY(m.nRegKey) m.nRegKey = HKEY_CLASSES_ROOT ENDIF * Load API functions nErrCode = THIS.LoadRegFuncs() IF m.nErrCode # ERROR_SUCCESS RETURN m.nErrCode ENDIF lSaveCreateKey = THIS.lCreateKey IF m.nPCount>2 AND TYPE("m.lCreateKey") = "L" THIS.lCreateKey = m.lCreateKey ENDIF IF THIS.lCreateKey * Try to open or create registry key nErrCode = RegCreateKey(m.nRegKey,m.cLookUpKey,@nSubKey) ELSE * Try to open registry key nErrCode = RegOpenKey(m.nRegKey,m.cLookUpKey,@nSubKey) ENDIF THIS.lCreateKey = m.lSaveCreateKey IF nErrCode # ERROR_SUCCESS RETURN m.nErrCode ENDIF THIS.nCurrentKey = m.nSubKey RETURN ERROR_SUCCESS ENDPROC PROCEDURE closekey * Closes a registry key =RegCloseKey(THIS.nCurrentKey) THIS.nCurrentKey =0 ENDPROC PROCEDURE setregkey * This routine sets a registry key setting * ex. THIS.SetRegKey("ResWidth","640",; * "Software\Microsoft\VisualFoxPro\6.0\Options",; * HKEY_CURRENT_USER) LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey,lCreateKey LOCAL iPos,cOptKey,cOption,nErrNum iPos = 0 cOption = "" nErrNum = ERROR_SUCCESS * Open registry key m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey,m.lCreateKey) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Set Key value nErrNum = THIS.SetKeyValue(m.cOptName,m.cOptVal) * Close registry key THIS.CloseKey() &&close key RETURN m.nErrNum ENDPROC PROCEDURE getregkey * This routine gets a registry key setting * ex. THIS.GetRegKey("ResWidth",@cValue,; * "Software\Microsoft\VisualFoxPro\4.0\Options",; * HKEY_CURRENT_USER) LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey LOCAL iPos,cOption,nErrNum iPos = 0 cOption = "" nErrNum = ERROR_SUCCESS * Open registry key m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Get the key value nErrNum = THIS.GetKeyValue(cOptName,@cOptVal) * Close registry key THIS.CloseKey() &&close key RETURN m.nErrNum ENDPROC PROCEDURE getkeyvalue * Obtains a value from a registry key * Note: this routine only handles Data strings (REG_SZ) LPARAMETER cValueName,cKeyValue LOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCode STORE 0 TO lpdwReserved,lpdwType STORE SPACE(256) TO lpbData STORE LEN(m.lpbData) TO m.lpcbData DO CASE CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 RETURN ERROR_BADKEY CASE TYPE("m.cValueName") #"C" RETURN ERROR_BADPARM ENDCASE m.nErrCode=RegQueryValueEx(THIS.nCurrentKey,m.cValueName,; m.lpdwReserved,@lpdwType,@lpbData,@lpcbData) * Check for error IF m.nErrCode # ERROR_SUCCESS RETURN m.nErrCode ENDIF * Make sure we have a data string data type IF m.lpdwType # REG_SZ AND m.lpdwType # REG_EXPAND_SZ RETURN ERROR_NONSTR_DATA ENDIF m.cKeyValue = LEFT(m.lpbData,m.lpcbData-1) RETURN ERROR_SUCCESS ENDPROC PROCEDURE setkeyvalue * This routine sets a key value * Note: this routine only handles data strings (REG_SZ) LPARAMETER cValueName,cValue LOCAL nValueSize,nErrCode DO CASE CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 RETURN ERROR_BADKEY CASE TYPE("m.cValueName") #"C" OR TYPE("m.cValue")#"C" RETURN ERROR_BADPARM *!* CASE EMPTY(m.cValueName) *!* RETURN ERROR_BADPARM ENDCASE * Make sure we null terminate this guy cValue = m.cValue+CHR(0) nValueSize = LEN(m.cValue) * Set the key value here m.nErrCode = RegSetValueEx(THIS.nCurrentKey,m.cValueName,0,; REG_SZ,m.cValue,m.nValueSize) * Check for error IF m.nErrCode # ERROR_SUCCESS RETURN m.nErrCode ENDIF RETURN ERROR_SUCCESS ENDPROC PROCEDURE deletekey * This routine deletes a Registry Key LPARAMETER nUserKey,cKeyPath LOCAL nErrNum nErrNum = ERROR_SUCCESS * Delete key m.nErrNum = RegDeleteKey(m.nUserKey,m.cKeyPath) RETURN m.nErrNum ENDPROC PROCEDURE enumoptions * Enumerates through all entries for a key and populates array LPARAMETER aRegOpts,cOptPath,nUserKey,lEnumKeys LOCAL iPos,cOption,nErrNum iPos = 0 cOption = "" nErrNum = ERROR_SUCCESS IF PCOUNT()<4 OR TYPE("m.lEnumKeys") # "L" lEnumKeys = .F. ENDIF * Open key m.nErrNum = THIS.OpenKey(m.cOptPath,m.nUserKey) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Enumerate through keys IF m.lEnumKeys * Enumerate and get key names nErrNum = THIS.EnumKeys(@aRegOpts) ELSE * Enumerate and get all key values nErrNum = THIS.EnumKeyValues(@aRegOpts) ENDIF * Close key THIS.CloseKey() &&close key RETURN m.nErrNum ENDPROC PROCEDURE iskey * Checks to see if a key exists LPARAMETER cKeyName,nRegKey LOCAL nErrNum * Open extension key nErrNum = THIS.OpenKey(m.cKeyName,m.nRegKey) IF m.nErrNum = ERROR_SUCCESS * Close extension key THIS.CloseKey() ENDIF RETURN m.nErrNum = ERROR_SUCCESS ENDPROC PROCEDURE enumkeys LPARAMETERS aKeyNames LOCAL nKeyEntry,cNewKey,cbuf,nbuflen,cRetTime, nKeySize, nErrCode nKeyEntry = 0 DIMENSION aKeyNames[1] DO WHILE .T. nKeySize = 0 cNewKey = SPACE(100) nKeySize = LEN(m.cNewKey) cbuf=space(100) nbuflen=len(m.cbuf) cRetTime=space(100) m.nErrCode = RegEnumKeyEx(THIS.nCurrentKey,m.nKeyEntry,@cNewKey,@nKeySize,0,@cbuf,@nbuflen,@cRetTime) DO CASE CASE m.nErrCode = ERROR_EOF EXIT CASE m.nErrCode # ERROR_SUCCESS EXIT ENDCASE cNewKey = ALLTRIM(m.cNewKey) cNewKey = LEFT(m.cNewKey,LEN(m.cNewKey)-1) IF !EMPTY(aKeyNames[1]) DIMENSION aKeyNames[ALEN(aKeyNames)+1] ENDIF aKeyNames[ALEN(aKeyNames)] = m.cNewKey nKeyEntry = m.nKeyEntry + 1 ENDDO IF m.nErrCode = ERROR_EOF AND m.nKeyEntry # 0 m.nErrCode = ERROR_SUCCESS ENDIF RETURN m.nErrCode ENDPROC PROCEDURE enumkeyvalues * Enumerates through values of a registry key LPARAMETER aKeyValues LOCAL lpszValue,lpcchValue,lpdwReserved LOCAL lpdwType,lpbData,lpcbData LOCAL nErrCode,nKeyEntry STORE 0 TO nKeyEntry IF TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 RETURN ERROR_BADKEY ENDIF * Sorry, Win32s does not support this one! IF THIS.nCurrentOS = OS_W32S RETURN ERROR_BADPLAT ENDIF DO WHILE .T. STORE 0 TO lpdwReserved,lpdwType,nErrCode STORE SPACE(256) TO lpbData, lpszValue STORE LEN(lpbData) TO m.lpcchValue STORE LEN(lpszValue) TO m.lpcbData nErrCode=RegEnumValue(THIS.nCurrentKey,m.nKeyEntry,@lpszValue,; @lpcchValue,m.lpdwReserved,@lpdwType,@lpbData,@lpcbData) DO CASE CASE m.nErrCode = ERROR_EOF EXIT CASE m.nErrCode # ERROR_SUCCESS EXIT ENDCASE nKeyEntry = m.nKeyEntry + 1 * Set array values DIMENSION aKeyValues[m.nKeyEntry,2] aKeyValues[m.nKeyEntry,1] = LEFT(m.lpszValue,m.lpcchValue) DO CASE CASE lpdwType = REG_SZ aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) CASE lpdwType = REG_EXPAND_SZ AND !THIS.lDisAllowExpanded aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) CASE lpdwType = REG_BINARY * Don't support binary aKeyValues[m.nKeyEntry,2] = REG_BINARY_LOC CASE lpdwType = REG_DWORD * You will need to use ASC() to check values here. aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) OTHERWISE aKeyValues[m.nKeyEntry,2] = REG_UNKNOWN_LOC ENDCASE ENDDO IF m.nErrCode = ERROR_EOF AND m.nKeyEntry#0 m.nErrCode = ERROR_SUCCESS ENDIF RETURN m.nErrCode ENDPROC PROCEDURE deletekeyvalue LPARAMETER cOptName,cKeyPath,nUserKey LOCAL cOption,nErrNum cOption = cOptName nErrNum = ERROR_SUCCESS * Open key m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey) IF m.nErrNum # ERROR_SUCCESS RETURN m.nErrNum ENDIF * Delete the key value m.nErrNum = RegDeleteValue(THIS.nCurrentKey,m.cOption) * Close key THIS.CloseKey() && close key RETURN m.nErrNum ENDPROC PROCEDURE Init LOCAL laTmpDLLs,lnDlls DIMENSION laTmpDLLs[1] THIS.nUserKey = HKEY_CURRENT_USER THIS.cVFPOptPath = VFP_OPTIONS_KEY1 + _VFP.VERSION + VFP_OPTIONS_KEY2 DO CASE CASE _DOS OR _UNIX OR _MAC RETURN .F. CASE ATC("Windows 3",OS(1)) # 0 THIS.nCurrentOS = OS_W32S CASE ATC("Windows NT",OS(1)) # 0 THIS.nCurrentOS = OS_NT THIS.cRegDLLFile = DLL_ADVAPI_NT THIS.cINIDLLFile = DLL_KERNEL_NT THIS.cODBCDLLFile = DLL_ODBC_NT CASE VAL(OS(3)) >= 5 * Handle W2K, XP THIS.nCurrentOS = OS_NT THIS.cRegDLLFile = DLL_ADVAPI_NT THIS.cINIDLLFile = DLL_KERNEL_NT THIS.cODBCDLLFile = DLL_ODBC_NT OTHERWISE * Windows 95 THIS.nCurrentOS = OS_WIN95 THIS.cRegDLLFile = DLL_ADVAPI_WIN95 THIS.cINIDLLFile = DLL_KERNEL_WIN95 THIS.cODBCDLLFile = DLL_ODBC_WIN95 ENDCASE * Check if DLLs already loaded so we don't unload when done. lnDlls = ADLLS(laTmpDLLs) IF lnDlls > 0 IF ASCAN(laTmpDLLs,"RegOpenKey",-1,-1,-1,1)#0 THIS.lHasDllLoaded=.T. ENDIF ENDIF ENDPROC PROCEDURE Error LPARAMETERS nError, cMethod, nLine THIS.lhaderror = .T. =MESSAGEBOX(MESSAGE()) ENDPROC PROCEDURE Destroy IF !THIS.lHasDllLoaded CLEAR DLLS RegOpenKey CLEAR DLLS RegCreateKey CLEAR DLLS RegDeleteKey CLEAR DLLS RegDeleteValue CLEAR DLLS RegCloseKey CLEAR DLLS RegSetValueEx CLEAR DLLS RegQueryValueEx CLEAR DLLS RegEnumKey CLEAR DLLS RegEnumKeyEx CLEAR DLLS RegEnumValue ENDIF ENDPROC vfpclean.prgc:\docume~1\vfpbuild\locals~1\temp\vfpclean.fxp..\ffc\registry.vcxregistry.vct)) 1)1>F1~>S